Skip to main content

Go Pointer

Table of Contents

指针

  • 变量
  • 指针变量
类型变量名变量值变量存储地址
变量name1000x100001
指针变量nameAddr0x1001110x100002
 strVar := "initial"                             // 初始化变量赋值, 绑定一个固定地址, 值可以变, 地址不变, 类型不变
Printf("initial strVar value:%v, addr: %p\n", strVar, &strVar)

strAddr := &strVar // 初始化地址类型变量并赋值, 变量绑定地址, 变量值是一个地址
Printf("initial strAddr value: %v, addr: %p\n", strAddr, &strAddr)

addrVal := *strAddr // 初始化并赋值, 变量绑定地址, 地址类型才能取值
Printf("initial strVar value:%v, addr: %p\n", addrVal, &addrVal)

strVar = "modify"

Printf("modify strVar value:%v, addr: %p\n", strVar, &strVar)
Printf("modify strAddr value: %v, addr: %p\n", strAddr, &strAddr)
Printf("modify strVar value:%v, addr: %p\n", addrVal, &addrVal)

> strVar value:initial, addr: 0xc0000142b0
> strAddr value: 0xc0000142b0, addr: 0xc000012038
> addrVal value:initial, addr: 0xc0000142d0

> strVar value:modify, addr: 0xc0000142b0 // strVar 重新赋值(地址对应的值变化), 地址不变
> strAddr value: 0xc0000142b0, addr: 0xc000012038
> addrVal value:initial, addr: 0xc0000142d0 // 地址对应的值没有变化

定义变量后, 该变量的地址不变, 地址内的值可变化

变量地址

  • 符号: & 获取变量的地址
  • 符号: * 指针变量的值(地址)取值
 var str string = "hello"                        // 定义一个字符串变量 str, 值是 "hello" 地址是 0xc00001a078

addr := &str // addr 类型为 *string(地址类型), addr 的值是 0xc00001a078(str 地址), addr 地址是 0xc00000e018

tmp := *addr // 根据 addr 的值(0xc00001a078 str 地址)取值到 "hello" 赋值给 tmp. 等同于 tmp := "hello"

*addr = "end" // str 的地址不变, addr 指针一直指向 str 的值, 与 str = "end" 效果一致